# @Time : 2024-11-01 14:31
# @Author : Fioman 
# @Phone : 13149920693
"""
GIL(Global Interpreter Lock) 全局解释器锁,作用就是在一个进程当中,只要一个线程执行Python字节码.
GIL确保了线程安全,但是会限制Python多线程的并行性.
GIL的缺点是在多线程的任务中,Python的计算密集型任务不能真正的实现多核并行.
所以Python在解决IO密集型(网络请求,文件读写)的时候没什么影响,但是如果是CPU密集型,就会影响并行速度.
GIL释放的条件:
1) I/O操作: 文件读写,网络请求等,通常会释放GIL,让其他线程执行
2) Python解释器中切换上下文: 每当解释器执行了足够数量的字节码指令,GIL会自动释放并切换到其他的线程
3) C扩展模块, 部分第三方模块(如numpy)在执行计算密集型任务的时候可以释放GIL,从而允许多线程并行执行
"""

"""
进程和线程的区别?
1) 线程: 线程是操作系统可以调度的最小单元,没个线程代表一个独立的任务.一个进程可以包含多个线程,线程之间
            共享同一个进程的内存资源,开销小,启动速度快. 一个线程指的是进程中的一个单一的控制流.
            一个进程中可以并发多条线程,每条线程并行执行不同的任务.

2) 进程: 进程是操作系统分配资源的基本单位.每个进程有自己独立的内存空间,因此进程之间相对独立,
              避免了直接的资源冲突.进程间通信(IPC)相对复杂和耗时.是程序在一个数据集上的一次动态
              执行过程.进程中的第一个线程就是主线程,主线程可以创建其他的线程.
              其他的线程也可以创建线程,线程之间是平等的.进程有父进程和子进程,独立的内存控件,
              唯一的标识符: pid
              
3) Python中多线程适合IO密集型任务,而多进程适合CPU密集型任务,因为多进程可以绕开GIL实现
    真正的并行.
"""

"""
做个简单的比喻: 进程 = 火车, 线程 = 车厢  线程在进程下行进(单纯的车厢无法运行)
一个进程可以包含多个线程(一个火车可以有多个车厢)
不同的进程数据很难共享(一辆火车上的乘客和另外一个火车上的乘客很难沟通,除非是换乘或者是电话)
同一个进程下不同线程间数据很容易共享(A车间到B车间很容易)
进程要比线程消耗更多的计算机资源(采用多个火车,比多个车厢更花费资源)
进程间不会相互影响,一个线程挂掉会导致整个进程挂掉(一列活成不会影响到另外一列火车,但是如果一列火车上
中间的车厢着火了,将影响到所有的车厢,也就是影响整个火车)
进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一个火车的车厢不能行进在不同的轨道上)
进程使用的内存地址可以上锁,机一个线程使用某些共享内存时,其他的线程必须等它结束,才能使用这一块(比如火车上
的洗手间) 互斥量
进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只能允许多少人进入,如果满了需要在门口等,
等有人出去了才能进) 信号量
"""

"""
1) 单个CPU在任一时刻只能执行单个线程,只有多核CPU才能真正的做到多个线程同时执行
2) 一个进程包含多个线程,这些线程可以分布在多个CPU上
3) 多核CPU同时运行的线程可以属于单个进程或者不同进程.
4) 所以在大多数的编程语言中,因为切换消耗的资源更少,多线程比多线程效率更高
"""
